From eb37fd22e7d50cfd5c6131aeaeb230469af5056c Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Mon, 20 Jul 2015 09:05:52 +0200 Subject: [PATCH] quartz: implement maximized/unmaximized Instead of using the default zoom behaviour use the internal maximized state for selecting our own zoom target. This makes zooming work for CSD windows where for some reason the given default zoom target is the current window frame itself resulting in a shadowless window of the same size. While this makes the zoom button behave a bit different as expected it makes things more consistent with other platforms and fixes CSD zooming. --- gdk/quartz/GdkQuartzNSWindow.c | 39 ++++++++++++++++++++++++++++++++++ gdk/quartz/GdkQuartzNSWindow.h | 2 ++ gdk/quartz/gdkwindow-quartz.c | 24 +++++++-------------- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/gdk/quartz/GdkQuartzNSWindow.c b/gdk/quartz/GdkQuartzNSWindow.c index 8795d3d762..c6dc77c29d 100644 --- a/gdk/quartz/GdkQuartzNSWindow.c +++ b/gdk/quartz/GdkQuartzNSWindow.c @@ -689,4 +689,43 @@ update_context_from_dragging_info (id sender) return rect; } +- (NSRect)windowWillUseStandardFrame:(NSWindow *)nsWindow + defaultFrame:(NSRect)newFrame +{ + NSRect screenFrame = [[self screen] visibleFrame]; + GdkWindow *window = [[self contentView] gdkWindow]; + GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl); + gboolean maximized = gdk_window_get_state (window) & GDK_WINDOW_STATE_MAXIMIZED; + + if (!maximized) + return screenFrame; + else + return lastUnmaximizedFrame; +} + +- (BOOL)windowShouldZoom:(NSWindow *)nsWindow + toFrame:(NSRect)newFrame +{ + + GdkWindow *window = [[self contentView] gdkWindow]; + GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl); + gboolean maximized = gdk_window_get_state (window) & GDK_WINDOW_STATE_MAXIMIZED; + + if (maximized) + { + gdk_synthesize_window_state (window, + GDK_WINDOW_STATE_MAXIMIZED, + 0); + } + else + { + lastUnmaximizedFrame = [nsWindow frame]; + gdk_synthesize_window_state (window, + 0, + GDK_WINDOW_STATE_MAXIMIZED); + } + + return YES; +} + @end diff --git a/gdk/quartz/GdkQuartzNSWindow.h b/gdk/quartz/GdkQuartzNSWindow.h index 540b965afb..792ea24f48 100644 --- a/gdk/quartz/GdkQuartzNSWindow.h +++ b/gdk/quartz/GdkQuartzNSWindow.h @@ -32,6 +32,8 @@ NSPoint initialMoveLocation; NSPoint initialResizeLocation; NSRect initialResizeFrame; + + NSRect lastUnmaximizedFrame; } -(BOOL)isInMove; diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index f05ab9469f..7d6bfe4dad 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -2477,56 +2477,48 @@ static void gdk_quartz_window_maximize (GdkWindow *window) { GdkWindowImplQuartz *impl; + gboolean maximized; if (GDK_WINDOW_DESTROYED (window) || !WINDOW_IS_TOPLEVEL (window)) return; impl = GDK_WINDOW_IMPL_QUARTZ (window->impl); + maximized = gdk_window_get_state (window) & GDK_WINDOW_STATE_MAXIMIZED; if (GDK_WINDOW_IS_MAPPED (window)) { GDK_QUARTZ_ALLOC_POOL; - if (impl->toplevel && ![impl->toplevel isZoomed]) - [impl->toplevel zoom:nil]; + if (impl->toplevel && !maximized) + [impl->toplevel zoom:nil]; GDK_QUARTZ_RELEASE_POOL; } - else - { - gdk_synthesize_window_state (window, - 0, - GDK_WINDOW_STATE_MAXIMIZED); - } } static void gdk_quartz_window_unmaximize (GdkWindow *window) { GdkWindowImplQuartz *impl; + gboolean maximized; if (GDK_WINDOW_DESTROYED (window) || !WINDOW_IS_TOPLEVEL (window)) return; impl = GDK_WINDOW_IMPL_QUARTZ (window->impl); + maximized = gdk_window_get_state (window) & GDK_WINDOW_STATE_MAXIMIZED; if (GDK_WINDOW_IS_MAPPED (window)) { GDK_QUARTZ_ALLOC_POOL; - if (impl->toplevel && [impl->toplevel isZoomed]) - [impl->toplevel zoom:nil]; + if (impl->toplevel && maximized) + [impl->toplevel zoom:nil]; GDK_QUARTZ_RELEASE_POOL; } - else - { - gdk_synthesize_window_state (window, - GDK_WINDOW_STATE_MAXIMIZED, - 0); - } } static void -- 2.30.2